package com.tvunetworks.center.device.mapper;

import com.tvunetworks.center.common.model.ExtendExternal;
import com.tvunetworks.center.common.model.param.matrix.AddUserDeviceParam;
import com.tvunetworks.center.common.model.param.search.SlugInfo;
import com.tvunetworks.center.common.model.vo.matrix.UserPostionFlag;
import com.tvunetworks.center.device.model.MyDevice;
import com.tvunetworks.center.gs.model.Device;
import org.apache.ibatis.annotations.Param;
import tk.mybatis.mapper.common.Mapper;

import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * @author lebronchen
 * @program: tvucc-aggregator
 * @create: 2019-11-05 14:45
 **/
public interface MyDeviceMapper extends Mapper<MyDevice> {
    /**
     * 根据pid获取device设备信息
     *
     * @param peerId peerId
     * @return Device
     */
    Device getDeviceByPeerId(@Param("peerId") String peerId);

    /**
     * 根据pid集合批量获取设备信息
     *
     * @param peerIds peerIds
     * @return List
     */
    List<Device> listDevices(@Param("peerIds") Collection<String> peerIds);

    /**
     * @param userId userId
     * @param peerId peerId
     * @return int
     */
    int countUserDevice(@Param("userId") String userId, @Param("peerId") String peerId);

    /**
     * @param peerId peerId
     * @return MyDevice
     */
    MyDevice getMyDeviceByPeerId(@Param("peerId") String peerId);

    /**
     * 更新ext的名字
     *
     * @param peerId peerId
     * @param name   name
     * @param url    url
     * @param remark remark
     * @return int
     */
    int updateExt(@Param("peerId") String peerId, @Param("name") String name, @Param("url") String url, @Param("remark") String remark);

    /**
     * 查询source是否是token配对到用户下的
     *
     * @param userId   userId
     * @param sourceId sourceId
     * @return int
     */
    int sourceFromUserToken(@Param("userId") String userId, @Param("sourceId") String sourceId);

    /**
     * 查询R是否在Running的booking，用于stopLive时校验
     *
     * @param rid rid
     * @param now now
     * @return int
     */
    int receiverRunningInBooking(@Param("rid") String rid, @Param("now") long now);

    /**
     * @param db       db
     * @param matrixId matrixId
     * @return List
     */
    List<Map<String, String>> getSwitchType(@Param("db") String db, @Param("matrixId") String matrixId);

    /**
     * @param condition     condition
     * @param typeCondition typeCondition
     * @return List
     */
    List<String> listAllPeerIdFilterByTypeAndCondition(@Param("condition") String condition, @Param("typeCondition") String typeCondition);

    /**
     * @param peerId peerId
     * @param name   name
     * @return int
     */
    int updateDeviceNameToRemark(@Param("peerId") String peerId, @Param("name") String name);

    /**
     * @param extendExternal extendExternal
     */
    void updateDeviceUrl(ExtendExternal extendExternal);

    /**
     * @param userId   userId
     * @param name     name
     * @param pageNum  pageNum
     * @param pageSize pageSize
     * @return List
     */
    List<Device> listFile(@Param("userId") String userId, @Param("name") String name, @Param("pageNum") int pageNum, @Param("pageSize") int pageSize);

    /**
     * @param userId userId
     * @param name   name
     * @return int
     */
    int listFileCount(@Param("userId") String userId, @Param("name") String name);

    /**
     * @param types types
     * @return List
     */
    List<String> listPeerIdByTypes(@Param("types") List<String> types);

    /**
     * 通过名字查询device
     *
     * @param name name
     * @return MyDevice
     */
    MyDevice getDeviceByName(@Param("name") String name);

    /**
     * 删除用户的device
     *
     * @param peerId peerId
     */
    void deleteUserDevice(@Param("peerId") String peerId);

    /**
     * @param peerId peerId
     */
    void deleteBookmarkDevice(@Param("peerId") String peerId);

    /**
     * @param peerId peerId
     */

    void deleteDeviceWithSource(@Param("peerId") String peerId);

    /**
     * @param peerId peerId
     */
    void deleteUserDeviceWithSource(@Param("peerId") String peerId);

    /**
     * @param peerId peerId
     */
    void deleteBookmarkDeviceWithSource(@Param("peerId") String peerId);

    /**
     * @param peerId peerId
     * @return List
     */
    List<UserPostionFlag> listUserPostionFlag(@Param("peerId") String peerId);

    /**
     * 给用户增加device
     *
     * @param param param
     */
    void addUserDevice(AddUserDeviceParam param);

    /**
     * @param peerIds   peerIds
     * @param condition condition
     * @return List
     */
    List<String> filterByCondition(@Param("peerIds") List<String> peerIds, @Param("condition") String condition);

    /**
     * @param device device
     * @return List
     */
    List<Device> listDeviceByExample(Device device);

    /**
     * 获取所有Ip不为null的R
     *
     * @return List
     */
    List<Device> listReceiverByIpIsNotNull();

    /**
     * 根据批量的peerId,获取其中的Rid
     *
     * @param rid rid
     * @return List
     */

    List<String> getReceiverIdPeerId(List<String> rid);

    /**
     * @param list list
     * @return int
     * @throws Exception if has error
     * @author KevinLi
     * @date 12/7/2021
     */
    int synGridSlug(List<SlugInfo> list);

    /**
     * @author kevin
     * @param peerId peerId
     * @param slug slug
     * @return int 数量
     * @throws Exception 编译异常
     **/
    int updateMetadata(@Param("peerId") String peerId, @Param("slug") String slug);

    /**
     * 根据设备Id,去tvu_device表修改platform字段
     *
     * @param peerId   peerId
     * @param platform 平台号
     */
    void updatePlatformByPeerId(String peerId, String platform);
}
